perm filename STRUCT.UN1[LSP,JRA] blob
sn#100799 filedate 1974-05-07 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00003 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 term ::= var
C00003 00003 unify[x:termsy:termsz:subs]answer
C00005 ENDMK
C⊗;
term ::= var
::= f_app
f_app ::= struct[n:f_name;a:terms]
f_name ::= id
terms ::= seq[term]
subs ::= seq[sub]
sub ::= struct[n:var;v:term]
answer ::= boolean
::= subs
unify[x:terms;y:terms;z:subs]answer
on(x,y;ε,λ[[r,t,z]{generic(unify1(r,t,z))
[boolean] → FALSE}]) *"→" means exit with value
unify1[t:term;u:term;z:subs]answer
generic(a:subst(t,z),b:subst(u,z))
[var,var] => compose(z,a,b)
[var,f_app(*,c)] => {occ_list(a,c) => FALSE;compose(z,a,c)}
[f_app(*,c),var] => {occ_list(b,c) => FALSE;compose(z,b,c)}
[f_app(f,c),f_app(g,d)] => {f≠g => FALSE;unify(c,d,z)}
end;
subst[t:term;z;subs]term
generic(t)
[var] => subv(t,z)
[f_app(u,v)] => f_app(u,su_list(v,z))
end;
subv[x:var;z;subs]term
on(z;x,λ[[z,y] n(z)=x → v(z)])
su_list[x;terms;z:subs]terms
on(x; *,λ[[x,y]subst(x,z)]; ε,terms)
occur[x:var;t:term]boolean
generic(t)
[var] =>x=t
[f_app(*,v)] => occ_list(x,v)
end;
occ_list(x:var;y:terms) boolean
on(y; FALSE,λ[[y,z][occur(x,y)→TRUE]])
compose[z:subs;v:var;t:term]subs
on(z;ε,λ[[u,w][n(u)=v → LOSS; sub(u,subst(a,subs(sub(v,t))))]];sub(v,t),subs)
end;